fix bugs with gpx passthrough. (#1197)
authortsteven4 <13596209+tsteven4@users.noreply.github.com>
Thu, 26 Oct 2023 23:24:23 +0000 (17:24 -0600)
committerGitHub <noreply@github.com>
Thu, 26 Oct 2023 23:24:23 +0000 (17:24 -0600)
with gpx 1.0, any extension data that was a child of rte or trk
was lost.  I beleive this used to work but has been broken for quite
a while.

with gpx 1.0 extension data that was a child of gpx could be
erroneously rewritten as part of the final wpt/rtept/trkpt.

with gpx 1.1 extension data that was a chile of trkseg could be
erroneously rewritten as part of the final wpt/rtept/trkpt.

I note we currently drop any extension data that is a child of gpx,
,a child of trkseg, or a child of metadata.

gpx.cc
reference/gpxpassthrough10.gpx [new file with mode: 0644]
reference/gpxpassthrough10~gpx.gpx [new file with mode: 0644]
reference/gpxpassthrough11.gpx [new file with mode: 0644]
reference/gpxpassthrough11~gpx.gpx [new file with mode: 0644]
testo.d/gpx.test
tools/schema/gpx/master.xsd
tools/schema/gpx/testonlyschema.xsd [new file with mode: 0644]

diff --git a/gpx.cc b/gpx.cc
index 1439a5f0c3258fcc41ad690fc2019dcadd3e4d4a..9c8f5bf8d847a1b2d41111afa77c8f55d26e1b93 100644 (file)
--- a/gpx.cc
+++ b/gpx.cc
@@ -522,6 +522,7 @@ GpxFormat::gpx_end(QStringView /*unused*/)
     logpoint_ct = 0;
     cur_tag = nullptr;
     wpt_tmp = nullptr;
+    fs_ptr = nullptr;
     break;
   case tt_cache_name:
     wpt_tmp->notes = cdatastr;
@@ -616,6 +617,7 @@ GpxFormat::gpx_end(QStringView /*unused*/)
       delete rh_link_;
       rh_link_ = nullptr;
     }
+    fs_ptr = nullptr;
     break;
   case tt_rte_rtept:
     if (link_) {
@@ -631,6 +633,7 @@ GpxFormat::gpx_end(QStringView /*unused*/)
     }
     route_add_wpt(rte_head, wpt_tmp);
     wpt_tmp = nullptr;
+    fs_ptr = nullptr;
     break;
   case tt_rte_desc:
     rte_head->rte_desc = cdatastr;
@@ -661,9 +664,11 @@ GpxFormat::gpx_end(QStringView /*unused*/)
       delete rh_link_;
       rh_link_ = nullptr;
     }
+    fs_ptr = nullptr;
     break;
   case tt_trk_trkseg:
     next_trkpt_is_new_seg = 1;
+    fs_ptr = nullptr;
     break;
   case tt_trk_trkseg_trkpt:
     if (link_) {
@@ -679,6 +684,7 @@ GpxFormat::gpx_end(QStringView /*unused*/)
     }
     track_add_wpt(trk_head, wpt_tmp);
     wpt_tmp = nullptr;
+    fs_ptr = nullptr;
     break;
   case tt_trk_desc:
     trk_head->rte_desc = cdatastr;
@@ -920,7 +926,7 @@ GpxFormat::wr_init(const QString& fname)
   // normalization makes them null.
   if (gpx_write_version.isNull() || (gpx_write_version < gpx_1_0)) {
     fatal(FatalMsg() << MYNAME ": gpx version number"
-            << gpx_write_version << "not valid.");
+          << gpx_write_version << "not valid.");
   }
 
   writer->setAutoFormatting(true);
@@ -1092,9 +1098,9 @@ GpxFormat::read()
 
   if (reader->hasError())  {
     fatal(FatalMsg() << MYNAME << "Read error:" << reader->errorString()
-            << "File:" << iqfile->fileName()
-            << "Line:" << reader->lineNumber()
-            << "Column:" << reader->columnNumber());
+          << "File:" << iqfile->fileName()
+          << "Line:" << reader->lineNumber()
+          << "Column:" << reader->columnNumber());
   }
 }
 
@@ -1369,7 +1375,7 @@ void GpxFormat::gpx_write_common_core(const Waypoint* waypointp,
                                       const gpx_point_type point_type) const
 {
   const auto* fs_gpxwpt = reinterpret_cast<gpx_wpt_fsdata*>(waypointp->fs.FsChainFind(kFsGpxWpt));
-    
+
   gpx_write_common_position(waypointp, point_type, fs_gpxwpt);
   gpx_write_common_description(waypointp, point_type, fs_gpxwpt);
   gpx_write_common_acc(waypointp, fs_gpxwpt);
@@ -1389,7 +1395,15 @@ GpxFormat::gpx_waypt_pr(const Waypoint* waypointp) const
     auto* gmsd = garmin_fs_t::find(waypointp); /* gARmIN sPECIAL dATA */
     if (fs_gpx) {
       if (! gmsd) {
-        fprint_xml_chain(fs_gpx->tag);
+        if (fs_gpx->tag) {
+          if (gpx_write_version > gpx_1_0) {
+            writer->writeStartElement("extensions");
+          }
+          fprint_xml_chain(fs_gpx->tag);
+          if (gpx_write_version > gpx_1_0) {
+            writer->writeEndElement();
+          }
+        }
       }
     }
     if (gmsd && (gpx_write_version > gpx_1_0)) {
@@ -1416,23 +1430,21 @@ GpxFormat::gpx_track_hdr(const route_head* rte)
     writer->writeTextElement(QStringLiteral("number"), QString::number(rte->rte_num));
   }
 
-  if (gpx_write_version > gpx_1_0) {
-    if (!(opt_humminbirdext || opt_garminext)) {
-      const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
-      if (fs_gpx) {
-        fprint_xml_chain(fs_gpx->tag);
-      }
-    } else if (opt_garminext) {
-      if (rte->line_color.bbggrr > unknown_color) {
-        int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
-        if (ci > 0) {
-          writer->writeStartElement(QStringLiteral("extensions"));
-          writer->writeStartElement(QStringLiteral("gpxx:TrackExtension"));
-          writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
-                                   .arg(gt_color_name(ci)));
-          writer->writeEndElement(); // Close gpxx:TrackExtension tag
-          writer->writeEndElement(); // Close extensions tag
-        }
+  if (!(opt_humminbirdext || opt_garminext)) {
+    const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
+    if (fs_gpx) {
+      fprint_xml_chain(fs_gpx->tag);
+    }
+  } else if (opt_garminext && (gpx_write_version > gpx_1_0)) {
+    if (rte->line_color.bbggrr > unknown_color) {
+      int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
+      if (ci > 0) {
+        writer->writeStartElement(QStringLiteral("extensions"));
+        writer->writeStartElement(QStringLiteral("gpxx:TrackExtension"));
+        writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
+                                 .arg(gt_color_name(ci)));
+        writer->writeEndElement(); // Close gpxx:TrackExtension tag
+        writer->writeEndElement(); // Close extensions tag
       }
     }
   }
@@ -1506,25 +1518,23 @@ GpxFormat::gpx_route_hdr(const route_head* rte) const
     writer->writeTextElement(QStringLiteral("number"), QString::number(rte->rte_num));
   }
 
-  if (gpx_write_version > gpx_1_0) {
-    if (!(opt_humminbirdext || opt_garminext)) {
-      const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
-      if (fs_gpx) {
-        fprint_xml_chain(fs_gpx->tag);
-      }
-    } else if (opt_garminext) {
-      if (rte->line_color.bbggrr > unknown_color) {
-        int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
-        if (ci > 0) {
-          writer->writeStartElement(QStringLiteral("extensions"));
-          writer->writeStartElement(QStringLiteral("gpxx:RouteExtension"));
-          // FIXME: the value to use for IsAutoNamed is questionable.
-          writer->writeTextElement(QStringLiteral("gpxx:IsAutoNamed"), rte->rte_name.isEmpty()? QStringLiteral("true") : QStringLiteral("false")); // Required element
-          writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
-                                   .arg(gt_color_name(ci)));
-          writer->writeEndElement(); // Close gpxx:RouteExtension tag
-          writer->writeEndElement(); // Close extensions tag
-        }
+  if (!(opt_humminbirdext || opt_garminext)) {
+    const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
+    if (fs_gpx) {
+      fprint_xml_chain(fs_gpx->tag);
+    }
+  } else if (opt_garminext && (gpx_write_version > gpx_1_0)) {
+    if (rte->line_color.bbggrr > unknown_color) {
+      int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
+      if (ci > 0) {
+        writer->writeStartElement(QStringLiteral("extensions"));
+        writer->writeStartElement(QStringLiteral("gpxx:RouteExtension"));
+        // FIXME: the value to use for IsAutoNamed is questionable.
+        writer->writeTextElement(QStringLiteral("gpxx:IsAutoNamed"), rte->rte_name.isEmpty()? QStringLiteral("true") : QStringLiteral("false")); // Required element
+        writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
+                                 .arg(gt_color_name(ci)));
+        writer->writeEndElement(); // Close gpxx:RouteExtension tag
+        writer->writeEndElement(); // Close extensions tag
       }
     }
   }
diff --git a/reference/gpxpassthrough10.gpx b/reference/gpxpassthrough10.gpx
new file mode 100644 (file)
index 0000000..937a022
--- /dev/null
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" xmlns:foreign="http://www.gpsbabel.org/testonlyschema" version="1.0" creator="hand crafted" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
+  <time>2010-10-16T14:27:17Z</time>
+  <wpt lat="36.339560000" lon="-117.422570000">
+    <ele>479.300</ele>
+    <name>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</name>
+    <cmt>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</cmt>
+    <desc>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</desc>
+  </wpt>
+  <wpt lat="36.460850000" lon="-116.865460000">
+    <ele>-55.600</ele>
+    <name>Turn right at Airport Rd</name>
+    <cmt>Turn right at Airport Rd</cmt>
+    <desc>Turn right at Airport Rd</desc>
+    <foreign:something>wpt</foreign:something>
+  </wpt>
+  <wpt lat="36.463640000" lon="-116.879200000">
+    <ele>-67.300</ele>
+    <name>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</name>
+    <cmt>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</cmt>
+    <desc>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</desc>
+  </wpt>
+  <rte>
+    <name>Low Road</name>
+    <desc>Generated from track Route</desc>
+    <foreign:something>rte</foreign:something>
+    <rtept lat="36.339560000" lon="-117.422570000">
+      <ele>479.300</ele>
+      <name>RPT001</name>
+    </rtept>
+    <rtept lat="36.345010000" lon="-117.354270000">
+      <ele>624.300</ele>
+      <name>RPT005</name>
+      <foreign:something>rtept</foreign:something>
+    </rtept>
+    <rtept lat="36.344640000" lon="-117.349030000">
+      <ele>663.700</ele>
+      <name>RPT011</name>
+    </rtept>
+  </rte>
+  <trk>
+    <name>meridian</name>
+    <foreign:something>trk</foreign:something>
+    <trkseg>
+      <trkpt lat="30.062183333" lon="-91.610350000">
+        <ele>1.000</ele>
+        <time>2002-05-25T17:06:21.250Z</time>
+      </trkpt>
+      <trkpt lat="30.062783333" lon="-91.610566667">
+        <ele>0.000</ele>
+        <time>2002-05-25T17:09:55.190Z</time>
+        <foreign:something>trkpt</foreign:something>
+      </trkpt>
+      <trkpt lat="30.062700000" lon="-91.608266667">
+        <ele>0.000</ele>
+        <time>2002-05-25T17:12:00.200Z</time>
+      </trkpt>
+    </trkseg>
+  </trk>
+  <foreign:something>eof</foreign:something>
+</gpx>
diff --git a/reference/gpxpassthrough10~gpx.gpx b/reference/gpxpassthrough10~gpx.gpx
new file mode 100644 (file)
index 0000000..4864813
--- /dev/null
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:foreign="http://www.gpsbabel.org/testonlyschema">
+  <time>1970-01-01T00:00:00Z</time>
+  <bounds minlat="30.062183333" minlon="-117.422570000" maxlat="36.463640000" maxlon="-91.608266667"/>
+  <wpt lat="36.339560000" lon="-117.422570000">
+    <ele>479.300</ele>
+    <name>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</name>
+    <cmt>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</cmt>
+    <desc>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</desc>
+  </wpt>
+  <wpt lat="36.460850000" lon="-116.865460000">
+    <ele>-55.600</ele>
+    <name>Turn right at Airport Rd</name>
+    <cmt>Turn right at Airport Rd</cmt>
+    <desc>Turn right at Airport Rd</desc>
+    <foreign:something>wpt</foreign:something>
+  </wpt>
+  <wpt lat="36.463640000" lon="-116.879200000">
+    <ele>-67.300</ele>
+    <name>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</name>
+    <cmt>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</cmt>
+    <desc>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</desc>
+  </wpt>
+  <rte>
+    <name>Low Road</name>
+    <desc>Generated from track Route</desc>
+    <foreign:something>rte</foreign:something>
+    <rtept lat="36.339560000" lon="-117.422570000">
+      <ele>479.300</ele>
+      <name>RPT001</name>
+    </rtept>
+    <rtept lat="36.345010000" lon="-117.354270000">
+      <ele>624.300</ele>
+      <name>RPT005</name>
+      <foreign:something>rtept</foreign:something>
+    </rtept>
+    <rtept lat="36.344640000" lon="-117.349030000">
+      <ele>663.700</ele>
+      <name>RPT011</name>
+    </rtept>
+  </rte>
+  <trk>
+    <name>meridian</name>
+    <foreign:something>trk</foreign:something>
+    <trkseg>
+      <trkpt lat="30.062183333" lon="-91.610350000">
+        <ele>1.000</ele>
+        <time>2002-05-25T17:06:21.250Z</time>
+      </trkpt>
+      <trkpt lat="30.062783333" lon="-91.610566667">
+        <ele>0.000</ele>
+        <time>2002-05-25T17:09:55.190Z</time>
+        <foreign:something>trkpt</foreign:something>
+      </trkpt>
+      <trkpt lat="30.062700000" lon="-91.608266667">
+        <ele>0.000</ele>
+        <time>2002-05-25T17:12:00.200Z</time>
+      </trkpt>
+    </trkseg>
+  </trk>
+</gpx>
diff --git a/reference/gpxpassthrough11.gpx b/reference/gpxpassthrough11.gpx
new file mode 100644 (file)
index 0000000..5337507
--- /dev/null
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xmlns:foreign="http://www.gpsbabel.org/testonlyschema" version="1.1" creator="hand crafted" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
+  <metadata>
+    <time>2010-10-16T14:27:17Z</time>
+    <extensions>
+      <foreign:something>metadata</foreign:something>
+    </extensions>
+  </metadata>
+  <wpt lat="36.339560000" lon="-117.422570000">
+    <ele>479.300</ele>
+    <name>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</name>
+    <cmt>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</cmt>
+    <desc>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</desc>
+  </wpt>
+  <wpt lat="36.460850000" lon="-116.865460000">
+    <ele>-55.600</ele>
+    <name>Turn right at Airport Rd</name>
+    <cmt>Turn right at Airport Rd</cmt>
+    <desc>Turn right at Airport Rd</desc>
+    <extensions>
+      <foreign:something>wpt</foreign:something>
+    </extensions>
+  </wpt>
+  <wpt lat="36.463640000" lon="-116.879200000">
+    <ele>-67.300</ele>
+    <name>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</name>
+    <cmt>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</cmt>
+    <desc>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</desc>
+  </wpt>
+  <rte>
+    <name>Low Road</name>
+    <desc>Generated from track Route</desc>
+    <extensions>
+      <foreign:something>rte</foreign:something>
+    </extensions>
+    <rtept lat="36.339560000" lon="-117.422570000">
+      <ele>479.300</ele>
+      <name>RPT001</name>
+    </rtept>
+    <rtept lat="36.345010000" lon="-117.354270000">
+      <ele>624.300</ele>
+      <name>RPT005</name>
+      <extensions>
+        <foreign:something>rtept</foreign:something>
+      </extensions>
+    </rtept>
+    <rtept lat="36.344640000" lon="-117.349030000">
+      <ele>663.700</ele>
+      <name>RPT011</name>
+    </rtept>
+  </rte>
+  <trk>
+    <name>meridian</name>
+    <extensions>
+      <foreign:something>trk</foreign:something>
+    </extensions>
+    <trkseg>
+      <trkpt lat="30.062183333" lon="-91.610350000">
+        <ele>1.000</ele>
+        <time>2002-05-25T17:06:21.250Z</time>
+      </trkpt>
+      <trkpt lat="30.062783333" lon="-91.610566667">
+        <ele>0.000</ele>
+        <time>2002-05-25T17:09:55.190Z</time>
+        <extensions>
+          <foreign:something>trkpt</foreign:something>
+        </extensions>
+      </trkpt>
+      <trkpt lat="30.062700000" lon="-91.608266667">
+        <ele>0.000</ele>
+        <time>2002-05-25T17:12:00.200Z</time>
+      </trkpt>
+      <extensions>
+        <foreign:something>trkseg</foreign:something>
+      </extensions>
+    </trkseg>
+  </trk>
+  <extensions>
+    <foreign:something>eof</foreign:something>
+  </extensions>
+</gpx>
diff --git a/reference/gpxpassthrough11~gpx.gpx b/reference/gpxpassthrough11~gpx.gpx
new file mode 100644 (file)
index 0000000..9183f17
--- /dev/null
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.1" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:foreign="http://www.gpsbabel.org/testonlyschema">
+  <metadata>
+    <time>1970-01-01T00:00:00Z</time>
+    <bounds minlat="30.062183333" minlon="-117.422570000" maxlat="36.463640000" maxlon="-91.608266667"/>
+  </metadata>
+  <wpt lat="36.339560000" lon="-117.422570000">
+    <ele>479.300</ele>
+    <name>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</name>
+    <cmt>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</cmt>
+    <desc>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</desc>
+  </wpt>
+  <wpt lat="36.460850000" lon="-116.865460000">
+    <ele>-55.600</ele>
+    <name>Turn right at Airport Rd</name>
+    <cmt>Turn right at Airport Rd</cmt>
+    <desc>Turn right at Airport Rd</desc>
+    <extensions>
+      <foreign:something>wpt</foreign:something>
+    </extensions>
+  </wpt>
+  <wpt lat="36.463640000" lon="-116.879200000">
+    <ele>-67.300</ele>
+    <name>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</name>
+    <cmt>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</cmt>
+    <desc>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</desc>
+  </wpt>
+  <rte>
+    <name>Low Road</name>
+    <desc>Generated from track Route</desc>
+    <extensions>
+      <foreign:something>rte</foreign:something>
+    </extensions>
+    <rtept lat="36.339560000" lon="-117.422570000">
+      <ele>479.300</ele>
+      <name>RPT001</name>
+    </rtept>
+    <rtept lat="36.345010000" lon="-117.354270000">
+      <ele>624.300</ele>
+      <name>RPT005</name>
+      <extensions>
+        <foreign:something>rtept</foreign:something>
+      </extensions>
+    </rtept>
+    <rtept lat="36.344640000" lon="-117.349030000">
+      <ele>663.700</ele>
+      <name>RPT011</name>
+    </rtept>
+  </rte>
+  <trk>
+    <name>meridian</name>
+    <extensions>
+      <foreign:something>trk</foreign:something>
+    </extensions>
+    <trkseg>
+      <trkpt lat="30.062183333" lon="-91.610350000">
+        <ele>1.000</ele>
+        <time>2002-05-25T17:06:21.250Z</time>
+      </trkpt>
+      <trkpt lat="30.062783333" lon="-91.610566667">
+        <ele>0.000</ele>
+        <time>2002-05-25T17:09:55.190Z</time>
+        <extensions>
+          <foreign:something>trkpt</foreign:something>
+        </extensions>
+      </trkpt>
+      <trkpt lat="30.062700000" lon="-91.608266667">
+        <ele>0.000</ele>
+        <time>2002-05-25T17:12:00.200Z</time>
+      </trkpt>
+    </trkseg>
+  </trk>
+</gpx>
index f37fcf267614095e27b9bd9492bf97a0d168c614..85581adf413943427b433c3e266631ce3bfbd77b 100644 (file)
@@ -66,6 +66,19 @@ compare ${REFERENCE}/track/garminconnect.csv ${TMPDIR}/garminconnect.csv
 gpsbabel -i gpx -f ${REFERENCE}/wptsequence.gpx -o gpx -F ${TMPDIR}/wptsequence.gpx
 compare ${REFERENCE}/wptsequence.gpx ${TMPDIR}/wptsequence.gpx
 
+# passthrough
+# gpx 1.0
+# we lose any extensions at the end of file - we don't have a place to store them.
+gpsbabel -i gpx -f ${REFERENCE}/gpxpassthrough10.gpx -o gpx -F ${TMPDIR}/gpxpassthrough10~gpx.gpx
+compare ${REFERENCE}/gpxpassthrough10~gpx.gpx ${TMPDIR}/gpxpassthrough10~gpx.gpx
+
+# gpx 1.1
+# we lose the any extensions in metadata, but we are constructing metadata anyway
+# we lose any extensions at the end of each trkseg  - we don't have a place to store them.
+# we lose any extensions at the end of file - we don't have a place to store them.
+gpsbabel -i gpx -f ${REFERENCE}/gpxpassthrough11.gpx -o gpx -F ${TMPDIR}/gpxpassthrough11~gpx.gpx
+compare ${REFERENCE}/gpxpassthrough11~gpx.gpx ${TMPDIR}/gpxpassthrough11~gpx.gpx
+
 if [ -z "${VALGRIND}" ]; then
   set -e
   if command -v xmllint > /dev/null;
index 7c767b4a4264ee43b6e4dc6fa5a9e3fc66b565db..7f159f3251bd20259cf6dc77b189c5bbe6533908 100644 (file)
@@ -11,5 +11,6 @@
 <xsd:import namespace="http://www.groundspeak.com/cache/1/0/1" schemaLocation="groundspeak/cache101.xsd"/>\r
 <xsd:import namespace="http://www.groundspeak.com/cache/1/1" schemaLocation="groundspeak/cache11.xsd"/>\r
 <xsd:import namespace="http://www.groundspeak.com/cache/1/2" schemaLocation="groundspeak/cache12.xsd"/>\r
+<xsd:import namespace="http://www.gpsbabel.org/testonlyschema" schemaLocation="testonlyschema.xsd"/>\r
 \r
 </xsd:schema>\r
diff --git a/tools/schema/gpx/testonlyschema.xsd b/tools/schema/gpx/testonlyschema.xsd
new file mode 100644 (file)
index 0000000..7bf28b1
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<xsd:schema\r
+       xmlns:xsd="http://www.w3.org/2001/XMLSchema"\r
+       xmlns:foreign="http://www.gpsbabel.org/testonlyschema"\r
+       targetNamespace="http://www.gpsbabel.org/testonlyschema"\r
+       elementFormDefault="qualified">\r
+\r
+  <xsd:annotation>\r
+    <xsd:documentation>\r
+      This schema exist only for regression testing of gpsbabel.\r
+    </xsd:documentation>\r
+  </xsd:annotation>\r
+\r
+  <xsd:element name="something" type="xsd:string"/>\r
+</xsd:schema> \r